package com.sqlcheck.service.impl;

import com.sqlcheck.service.ProgressCallback;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 简化的批次进度跟踪器
 * 只跟踪批次完成数量，不涉及复杂的进度同步
 * 
 * @author Claude
 * @version v1.0
 * @since 2025-09-11
 */
@Slf4j
public class SimpleBatchProgressTracker {
    
    private final AtomicInteger completedBatches = new AtomicInteger(0);
    private final int totalBatches;
    private final ProgressCallback progressCallback;
    private final String taskDescription;
    
    /**
     * 构造函数
     * 
     * @param totalBatches 总批次数
     * @param progressCallback 进度回调
     * @param taskDescription 任务描述（如"AI增强验证"）
     */
    public SimpleBatchProgressTracker(int totalBatches, ProgressCallback progressCallback, String taskDescription) {
        this.totalBatches = totalBatches;
        this.progressCallback = progressCallback;
        this.taskDescription = taskDescription != null ? taskDescription : "AI增强验证";
        
        log.info("初始化批次进度跟踪器 - 总批次数: {}, 任务: {}", totalBatches, this.taskDescription);
    }
    
    /**
     * 标记一个批次完成
     * 
     * @param batchNumber 批次编号（用于日志）
     */
    public void onBatchCompleted(int batchNumber) {
        int completed = completedBatches.incrementAndGet();
        
        log.debug("批次 {} 完成，总进度: {}/{}", batchNumber, completed, totalBatches);
        
        // 更新批次计数显示，不推进主进度条
        if (progressCallback != null) {
            String message = String.format("%s中... 已完成 %d/%d 个批次", 
                    taskDescription, completed, totalBatches);
            
            // 使用特殊标记表示这是状态更新而非进度更新
            progressCallback.onProgress(-1, -1, message);
        }
    }
    
    /**
     * 标记一个批次失败（也计入完成数）
     * 
     * @param batchNumber 批次编号
     * @param error 错误信息
     */
    public void onBatchError(int batchNumber, String error) {
        int completed = completedBatches.incrementAndGet();
        
        log.warn("批次 {} 失败但计入完成数，总进度: {}/{}, 错误: {}", 
                batchNumber, completed, totalBatches, error);
        
        // 即使失败也更新计数显示
        if (progressCallback != null) {
            String message = String.format("%s中... 已完成 %d/%d 个批次 (含失败批次)", 
                    taskDescription, completed, totalBatches);
            progressCallback.onProgress(-1, -1, message);
        }
    }
    
    /**
     * 所有批次完成后的最终进度更新
     * 
     * @param totalProcessedItems 实际处理的项目总数（如验证的SQL问题数）
     */
    public void onAllBatchesCompleted(int totalProcessedItems) {
        int completed = completedBatches.get();
        
        log.info("所有批次处理完成 - 完成批次: {}/{}, 处理项目: {}", 
                completed, totalBatches, totalProcessedItems);
        
        // 一次性推进到最终进度
        if (progressCallback != null) {
            String message = String.format("%s完成！共处理 %d 个项目", 
                    taskDescription, totalProcessedItems);
            
            // 使用totalBatches作为最终进度值
            progressCallback.onProgress(totalBatches, totalBatches, message);
        }
    }
    
    /**
     * 获取当前已完成的批次数
     */
    public int getCompletedBatchCount() {
        return completedBatches.get();
    }
    
    /**
     * 获取总批次数
     */
    public int getTotalBatches() {
        return totalBatches;
    }
    
    /**
     * 检查是否所有批次都已完成
     */
    public boolean isAllCompleted() {
        return completedBatches.get() >= totalBatches;
    }
    
    /**
     * 获取完成进度百分比（用于监控）
     */
    public double getCompletionPercentage() {
        if (totalBatches == 0) return 100.0;
        return (double) completedBatches.get() / totalBatches * 100.0;
    }
}